home *** CD-ROM | disk | FTP | other *** search
-
- {Program to simulate travel through a star field - try a different MaxStar}
- uses
- TpCrt, TpInline, Graph; {OpInline used for HiWord only}
- const
- MaxStar = 50; {num stars}
- MaxHistory = 3; {points per streak, = 2**n -1, note mask on line #59}
- type
- T_HistoryPoint = record
- hX, hY : Integer;
- end;
- T_Star = record
- X, Y : LongInt; {star position}
- DX, DY : LongInt; {delta}
- DXPositive,
- DYPositive : Boolean;
- Speed : Word;
- History : array[0..MaxHistory] of T_HistoryPoint; {Position history}
- HistIndex : Byte;
- end;
- T_StarArray = array[1..MaxStar] of T_Star;
- var
- Gd,
- Gm,
- i,
- j : Integer;
-
- Color : Word;
-
- A : T_StarArray;
- BoundX,
- BoundY,
- CenterX,
-
- CenterY : LongInt;
-
- Angle : Real;
-
- Shift : Byte;
-
- BEGIN
- Gd := Detect;
- InitGraph(Gd, Gm, '\turbo\tp');
- if GraphResult <> grOk then
- Halt(1);
- Color := GetMaxColor;
- BoundX := GetMaxX * 65536;
- BoundY := GetMaxY * 65536;
- CenterX := GetMaxX * 32768;
- CenterY := GetMaxY * 32768;
- FillChar(A, SizeOf(A), $FF);
- Randomize;
- {Background}
- for i := 1 to 1500 do
- PutPixel(Random(GetMaxX), Random(GetMaxY), Color);
- {Stars}
- repeat
- for i := 1 to MaxStar do
- with A[i] do
- begin
- if (X < 0) or (X > BoundX) or (Y < 0) or (Y > BoundY) then
- begin
- {Position is off-screen, go back to center, new angle}
- Angle := 6.283185 * Random;
- Speed := Random(2000) + 1000;
- DX := Round(Speed * Sin(Angle));
- DY := Round(Speed * Cos(Angle));
- X := 300 * DX + CenterX;
- Y := 300 * DY + CenterY;
- DXPositive := DX > 0;
- DYPositive := DY > 0;
- DX := Abs(DX);
- DY := Abs(DY);
- {Erase all of old line segment}
- for j := 0 to MaxHistory do
- with History[j] do
- PutPixel(hX, hY, 0);
- end
- else
- begin {Plot point}
- Inc(HistIndex); {Next slot in history}
- HistIndex := HistIndex and $03; { <-- change for new MaxHistory!}
- with History[HistIndex] do
- begin
- PutPixel(hX, hY, 0); {Erase inner dot of line segment}
- hX := HiWord(X);
- hY := HiWord(Y);
- PutPixel(hX, hY, Color); {New outer dot of line segment}
- end;
- {Next point}
- if DXPositive then
- Inc(X, DX)
- else
- Dec(X, DX); {Add delta}
- if DYPositive then
- Inc(Y, DY)
- else
- Dec(Y, DY);
- case Speed of
- 1000..1300 : Shift := 9;
- 1300..1600 : Shift := 8;
- 1600..2100 : Shift := 7;
- 2100..2700 : Shift := 6;
- 2700..2900 : Shift := 5;
- 2900..3000 : Shift := 4;
- end;
- Inc(DX, DX shr Shift); {Increase delta to accelerate}
- Inc(DY, DY shr Shift);
- end;
- end;
- until KeyPressed;
- ReadLn;
- CloseGraph;
- END.
-